#!/user/bin/env python3
# -*- coding: utf-8 -*-
import sys
import os
import time
from random import randint, sample


def generator_exam():
    f = [x ** 2 for x in range(1, 1000)]
    print(sys.getsizeof(f))   # 列表对象，一个数需要占用一个存储位置

    y = (x ** 2 for x in range(1, 1000))
    print(sys.getsizeof(y))  # 生成器对象
    print(y)
    for var in y:
        print(var)


# generator_exam()

def marquee():
    str1 = "北京欢迎您"
    while True:
        os.system('cls')
        print(str1)
        str1 = str1[1:] + str1[0]
        time.sleep(0.2)


# marquee()

"""
输出:由大小写字母和数字构成的验证码
"""


def verify_num(code_len=6):
    """

    :param code_len:验证码的长度
    :return: 指定长度的验证码
    """
    all_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    last_pos = len(all_chars) - 1
    code = ""
    for _ in range(code_len):
        index = randint(0, last_pos)
        code += all_chars[index]
    print("验证码为:{0}".format(code))


# verify_num()

"""
输出:一个文件名的后缀名
"""


def get_suf(filename, has_dot=False):
    """

    :param filename:文件名
    :param has_dot:是否有.
    :return: 文件类型
    """
    pos = filename.rfind('.')
    if 0 < pos < len(filename)-1:
        index = pos if has_dot else pos+1
        return filename[index:]
    else:
        return ' '


# print(get_suf("hhjs.txt"))


"""
输入：列表
输出：列表中最大和第二大的元素的值
"""


def get_top2(x):
    """

    :param x:列表
    :return: 列表中最大的值和第二大的值
    """
    m1, m2 = (x[0], x[1]) if x[0] > x[1] else (x[1], x[0])
    for i in range(2, len(x)):
        if x[i] > m1:
            m2 = m1
            m1 = x[i]
        elif x[i] > m2:
            m2 = x[i]
    return m1, m2


# print(get_top2([1, 2, 8, 4, 5, 2]))

"""
输入：指定的日期
输出：指定日期是一年中的第几天
"""


def is_leap_year(year):
    """

    :param year:需要判定是否为闰年的年份
    :return: 是否为闰年
    """
    return year % 4 == 0 and year % 100 != 0 or year % 400 == 0


def get_day_num(year, month, day):
    """

    :param year:年
    :param month: 月
    :param day: 日
    :return: 一年中的第几天
    """
    is_leap = is_leap_year(year)
    all_months = [
        [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
        [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    ][is_leap]  # 0表示取all_months第0行，1表示取all_month第一行
    day_num = 0
    for index in range(month-1):
        day_num += all_months[index]
    return day_num + day


# print(get_day_num(1980, 11, 12))

"""
输出:杨辉三角
"""


def yanghui(row):
    """

    :param row:设定杨辉三角的层数
    :return: 杨辉三角
    """
    if row == 0:
        return []
    res = [[1]]

    while len(res) < row:
        new_res = [a+b for a, b in zip([0] + res[-1], res[-1]+[0])]
        res.append(new_res)
    return res


# print(yanghui(6))


"""
输出：双色球
"""


def display(balls):
    """

    :param balls: 球号码列表
    :return: 列表中的双色球号码
    """
    for index, ball in enumerate(balls):
        if index == len(balls) - 1:
            print('|', end=" ")
        print('%02d' % ball, end=" ")
    print()


def random_select():
    """

    :return:随机输出一组号码
    """
    red_balls = [x for x in range(1, 34)]
    selected_balls = sample(red_balls, 6)
    selected_balls.sort()
    selected_balls.append(randint(1, 16))
    return selected_balls


# n = int(input("机选几注:"))
# for _ in range(n):
#     display(random_select())


"""
有15个基督徒和15个非基督徒在海上遇险，为了能让一部分人活下来不得不将其中15个人扔到海里面去，
有个人想了个办法就是大家围成一个圈，由某个人开始从1报数，报到9的人就扔到海里面，
他后面的人接着从1开始报数，报到9的人继续扔到海里面，直到扔掉15个人。
由于上帝的保佑，15个基督徒都幸免于难，
问这些人最开始是怎么站的，哪些位置是基督徒哪些位置是非基督徒。
"""


def josephus_ring():
    person = [True] * 30
    counter, index, number = 0, 0, 0
    while counter < 15:
        if person[index]:
            number += 1
            if number == 9:
                person[index] = False
                counter += 1
                number = 0
        index += 1
        index %= 30
    for one in person:
        print("基" if one else "非", end=" ")


# josephus_ring()
